<?php

/**
 * Kifejezés objektum
 * 
 * Az objektum értékének elemei a kifejezés elemei. A paraméterek lehetnek
 * string-ek, string-é alakítható objektumok, további kifejezések, és számok.
 * 
 * Példa:
 * <code>
 * $o->set(
 * 		array(
 * 			XQL_Field::create()->set(array('id')),
 * 			XQL_Operator::create()->isNotNull(),
 * 			XQL_Operator::create()->and_(
 * 				XQL_Expression::create()->set(
 * 					array(
 * 						XQL_Field::create()->set(array('content'))
 * 						XQL_Operator::create()->Like('%foo')
 * 					)
 * 				)
 * 			)
 * 		)
 * );
 * </code>
 * kimenet: (`id` IS NOT NULL AND (`content` LIKE '%foo'))
 * 
 */
class XQL_Expression extends XQL_Object
{
	/**
	 * Az objektum neve. Meg kell egyeznie egy sémának a nevével, amelyre illeszthető.
	 *
	 * @var string
	 */
	protected $objectName = 'expression';
	
	/**
	 * Jelzi, hogy szükséges-e kitenni a kifejezés elé és mögé a zárójeleket.
	 * 
	 * @var bool
	 */
	protected $brackets = TRUE;
	
	/**
	 * Felépíti az osztályhoz tartozó sémát. Implementálása kötelező.
	 *
	 */
	protected function buildSchema()
	{
		$this->objectSchema = new XQL_ExpressionSchema();
	}
	
	/**
	 * Visszatér egy példánnyal ugyanebből az osztályból.
	 *
	 * @return XQL_Expression
	 */
	public static function create()
	{
		return new XQL_Expression();
	}
	
	/**
	 * Beállítja, hogy szükséges-e kitenni a zárójeleket a kifejezés elé és mögé.
	 * 
	 * @param bool $state
	 * @return XQL_Expression Sajátmagával tér vissza
	 */
	public function setBrackets($state)
	{
		$this->brackets = $state;
		
		return $this;
	}
	
	/**
	 * Kizárólag ennek az objektumnak az értékével tér vissza. Implementációja
	 * kötelező. A további megvalósításokban ügyelni kell arra, hogy az egyes
	 * érték elemek akár olyan objektumok is lehetnek, amelyek string-ként
	 * térhetnek vissza (például más XQL_Object leszármazottak).
	 *
	 * @return string
	 */
	public function get()
	{
		$items = array_values($this->objectValue);
		$result = '';
		
		$rItems = array();
		foreach ($items as $v)
		{
			if (is_string($v))
			{
				$rItems[] = $this->connection->pdo->quote($v);
			}
			else if (is_object($v))
			{
				$rItems[] = (string)$v;
			}
			else
			{
				$rItems[] = $v;
			}
		}
		
		if ($this->brackets)
		{
			$result .= '('.implode(' ', $rItems).')';
		}
		else
		{
			$result .= implode(' ', $rItems);
		}
		
		return $result;
	}
	
}

?>